#pragma once
#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define DEV "/dev/null"

void daemonSelf(char *Path = nullptr)
{
    // 1.忽略掉进程的异常信号  PIPE 读端fd关闭时，写端写入，该信号会终止程序
    signal(SIGPIPE, SIG_IGN);

    // 2.自己(这个进程)不能是组长，setsid  让子进程执行
    if (fork() > 0)
    {
        exit(0);
    }
    pid_t id = setsid();
    assert(id != -1);
    // 3.是脱离终端的，需要关闭或者重定向之前进程打开的文件fd   打开黑洞文件 /dev/null  return -> fd
    int fd = open(DEV, O_RDWR); // 读写方式打开
    if (fd >= 0)
    {
        dup2(fd, 0); // new old
        dup2(fd, 1);
        dup2(fd, 2);

        close(fd);
    }
    else
    {
        close(0);
        close(1);
        close(2);
    }

    // 可选 -》执行路径发生改变
    if (Path != nullptr)
    {
        chdir(Path);
    }
}